

#include "listeCarte.h"
#include <malloc.h>

Pioche * creerPioche()
{
    Pioche * P = (Pioche*)malloc(sizeof(Pioche));
    initPioche(P);
    return P;
}
void initPioche(Pioche * P)
{
    P->debut = NULL;
    P->fin = NULL;
}
Cellule * creerCellule()
{
    Cellule * C = (Cellule*)malloc(sizeof(Cellule));
    initCellule(C);
    return C;
}
void initCellule(Cellule * C)
{
    C->suivant = NULL;
    C->preced = NULL;
    C->contenu = NULL;
}
void libereCellule(Cellule * C)
{
    C->suivant = NULL;
    C->preced = NULL;

    detruitCarte(&C->contenu);
}
void detruitCellule(Cellule ** C)
{
    libereCellule(*C);
    free(*C);
    *C = NULL;
}
void liberePioche(Pioche * pioche)
{
	Cellule * c;
	while (pioche->debut!=NULL)
	{
		c = pioche->debut;
		pioche->debut = pioche->debut->suivant ;
		detruitCellule(&c);
	}
	free(c);
}
void detruitPioche(Pioche ** P)
{
    liberePioche(*P);
    free(*P);
    *P = NULL;
}


void enfilerCarte (Pioche * P, Carte * carte)
{
    Cellule * c = creerCellule();
    c->contenu = carte;
    c->suivant = NULL;

	if(P->fin == NULL)
    {
        c->preced = NULL;
        P->debut = c;
    }
	else
	{
	    c->preced = P->fin;
	    P->fin->suivant = c;
	}

	P->fin = c;
}
void defilerRenfilerCarte (Pioche *pioche)
{
	/** Le 1er élément pointe sur le dernier, et inversement*/
	pioche->debut->preced = pioche->fin;
	    pioche->fin->suivant = pioche->debut;

	/** La sentinelle pointe sur le nouveau dernier élément (anciennement 1er)*/
    	pioche->fin = pioche->debut;
	/** La sentinelle pointe sur le nouveau 1er élément (anciennement 2ème)*/
    	pioche->debut = pioche->debut->suivant;

    	pioche->debut->preced = NULL;
    	pioche->fin->suivant = NULL;
}
Carte * retourneTetePioche(const Pioche * pio)
{
    return pio->debut->contenu;
}

void remplirPioche(Pioche * pioche, const char *nomFic)
{
    int i, j, k;

    FILE* fic = fichierInit(nomFic);
    int nbrLignes = nbLigne(fic);
    int nbCarte = nbrLignes/4;
    char *temp = malloc(sizeof(char)*128);
    Carte **tempListe = malloc(sizeof(Carte *) * nbCarte);

    rewind(fic);

    for(i=0;i<nbCarte;i++)
    {
        tempListe[i] = creerCarte();

        fgets(temp, 64, fic);
        tempListe[i]->genre = atoi(temp);
        fgets(tempListe[i]->nom, 32, fic);
        for(j=0;j<32;j++)
        {
            if(tempListe[i]->nom[j] == '\n')
                tempListe[i]->nom[j] = '\0';
        }

        fgets(tempListe[i]->definition, 128, fic);
        for(j=0;j<32;j++)
        {
            if(tempListe[i]->definition[j] == '\n')
                tempListe[i]->definition[j] = '\0';
        }
        fgets(temp, 64, fic);
    }

    while(nbCarte>0)
    {
        j = rand()%nbCarte;
        enfilerCarte(pioche, tempListe[j]);
        if(j < nbCarte-1)
        {
            for(k=j;k<nbCarte-1;k++)
            {
                tempListe[k] = tempListe[k+1];
            }
        }
        nbCarte--;
    }

    fclose(fic);
    free(temp);
    free(tempListe);
}
